﻿using System.Collections.Generic;

namespace BlogsAPI.Sites
{
    using System;
    using System.Web;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Text.RegularExpressions;
    using Interfaces;
    using Abstract;
    using System.Diagnostics;

    /// <summary>
    /// Одна из социальных сетей порожденных Яндексом
    /// Удаленная этим же яндексом в 2014 году
    /// </summary>
    [BlogServiceAPI(Link="http://wow.ya.ru",Description = "Blogs which are linked with email accaunt at @yandex.ru")]
    [Obsolete("Removed by Yandex =(")]
    public class YaRu : BlogServer, IPosts, IComments//, ILike
    {
        private static readonly Regex Validation = new Regex(@"^http://(?:[\w\-]+\.)?ya\.ru", Regexoptions);
        private static readonly Regex ValidationFull = new Regex(@"^http://(?:([\w\-]+)\.)?ya\.ru(?:/(.*?))?(?:/|$)", Regexoptions);
        
        #region interface BlogServer
        /// <summary>
        /// проверка, является ли передаваемый урл чатью этого сервиса
        /// http://flashr.ya.ru/?ncrnd=2486#y5__id85
        /// </summary>
        public override Boolean ValidateLink(String sLink)
        {
            return Validation.Match(sLink).Success;
        }

        /// <summary>
        /// проверка, является ли передаваемый урл чатью этого сервиса
        /// </summary>
        /// <param name="sLink">ссылка для проверки</param>
        /// <param name="userName">Имя пользователя на блогохостинге</param>
        /// <param name="bType">Тип блога - сообщество или блог</param>
        public override Boolean ValidateLink(String sLink, out String userName, out BlogType bType)
        {
            bType = BlogType.Unknown;
            Match m = ValidationFull.Match(sLink);
            if (m.Success)
            {
                if (String.Compare(m.Groups[1].ToString(), "clubs", true) == 0)
                {
                    userName = m.Groups[2].ToString();
                    bType = BlogType.Community;
                }
                else
                {
                    userName = m.Groups[1].ToString();
                    bType = BlogType.User;
                }
            }
            else
            {
                userName = String.Empty;
            }
            return m.Success;
        }

        /// <summary>
        /// Получение ссылки на блог блогера
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="btype">Тип блога - сообщество или блог</param>
        public override String GetBlogLink(string userName , BlogType btype)
        {
            return btype == BlogType.Community ? String.Format("http://clubs.ya.ru/{0}", userName) : String.Format("http://{0}.ya.ru", userName);
        }

        /// <summary>
        /// Формирование HTML кода для отображения имени пользователя
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="bt">Тип блога - сообщество или блог</param>
        /// <returns>HTML</returns>
        public override String GetUsernameHtml(string userName, BlogType bt)
        {
            return String.Format("<a href='{1}'><img style=\"margin:0px;\" src=\"//blob.t30p.ru/img/{2}2.gif\" width=\"20\" height=\"16\" border=\"0\" alt=\"\" />{0}</a>",
                userName, GetBlogLink(userName, bt), bt == BlogType.Community ? "c" : "m");
        }

        /// <summary>
        /// Определение числа читателей блога
        /// </summary>
        /// <param name="username">имя</param>
        /// <param name="bt">тип</param>
        /// <returns></returns>
        public override uint? HowManyReaders(string username, BlogType bt)
        {
            try
            {
                String blogname = GetBlogLink(username, bt);
                HttpWebRequest myHttpWebRequest = MakeRequest(blogname + 
                    (bt == BlogType.User ? "/profile_friends_friendof.xml" : "/clubs_allmembers_members.xml"));
                myHttpWebRequest.Method = "GET"; // метод GET
                myHttpWebRequest.Referer = blogname;
                //получаем ответ и его разбираем...
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding).ReadToEnd();
                myHttpWebResponse.Close();
                //ПОЛУЧИЛИ xml - откроемка его...
                Match m = bt == BlogType.User
                              ?
                                  (new Regex(
                                      @"profile_friends_friendsmutual\.xml\D+?(\d+)\D.*?profile_friends_friendof\.xml\D+?(\d+)\D",
                                      Regexoptions)).Match(result)
                              :
                                  (new Regex(
                                      @"clubs_allmembers_members\.xml\D+?(\d+)\D",
                                      Regexoptions)).Match(result);
                if (m.Success)
                {
                    //две цифры взаимные плюс те, кто просто добавил
                    return bt == BlogType.User?
                        uint.Parse(m.Groups[1].Value) + uint.Parse(m.Groups[2].Value)
                        : uint.Parse(m.Groups[1].Value);
                }
            }
            catch (Exception e1)
            {
                Debug.WriteLine("Ошибка загрузки числа читателей: " + e1.Message);
            }
            return null;
        }

        #endregion

        #region interface: IPosts

        /// <summary>
        /// Выкладывание записи в блоге
        /// </summary>
        /// <param name="user">Аккаунт блогера</param>
        /// <param name="bp">пост для блога</param>
        /// <returns></returns>
        public override PostResult MakePost(UserAccount user, BlogPost bp)
        {
            PostResult ps = new PostResult {Error = new NotImplementedException()};
            try
            {
                if (!LogInto(user))
                {
                    throw new Exception("YaRu: не удалось залогинится");
                }
                //Content-Type=multipart/form-data; boundary=---------------------------6759233132328
                /////////////////////
                HttpWebRequest myHttpWebRequest = MakeRequest(String.Format("http://{0}.ya.ru/ajax/post_do_save.xml", user.username));
                //выставили куку
                myHttpWebRequest.Referer = String.Format("http://{0}.ya.ru/posts_add_text.xml", user.username);
                myHttpWebRequest.Method = "POST"; // метод POST
                //////////////////////////
                //userpic=
                //&access_type=public
                //&replies=1
                //&title=
                //&tags=&tag=&=%20%2B%20&=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C
                //&submit_btn=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C
                //&type=text
                //&feed_id=2082239
                //&body=
                myHttpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
                string sQueryString = String.Format("userpic=&access_type={0}&replies=1&title={1}"+
                    "&body={2}" +
                     "&tags={3}" +
                      //"&tag={4}" +
                      "&type=text"
                      //+ "&feed_id={5}"
                      ,
                    //System.Web.HttpUtility.
                   GetAccessType(bp.Type),
                   bp.SubjectUrlEnc,
                   bp.BodyUrlEnc,
                   HttpUtility.UrlEncode(bp.GetParam(PostParams.Tags).ToString())
                   //, bp.SpecialParam
                   );
                //***************//
                byte[] byteArr = Encoding.GetBytes(sQueryString);
                myHttpWebRequest.ContentLength = byteArr.Length;
                myHttpWebRequest.GetRequestStream().Write(byteArr, 0, byteArr.Length);

                //myHttpWebRequest.ServicePoint.Expect100Continue = false;
                //myHttpWebRequest.Expect = null;
                ///////////
                // ставим False, чтобы при получении кода 302 не делать автоматический редирект
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                //получаем ответ
                string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding).ReadToEnd();
                myHttpWebResponse.Close();//если дошли до сюда, то все ок.
                //making post here
                //url:'http:\/\/onestory.ya.ru\/replies.xml?item_no=5'
                Regex weError = new Regex(@"status\W+error.*?reason\W+([^'""]+)", RegexOptions.IgnoreCase);
                Match m0 = weError.Match(result);
                if (m0.Success)//error
                {
                    ps.Error = new Exception("Причина ошибки: "+m0.Groups[1].ToString());
                    bp.Existance = false;
                }
                else
                {//all ok
                    Regex we = new Regex(@"url:\W+([^'""]+)", RegexOptions.IgnoreCase);
                    Match m = we.Match(result);
                    if (m.Success)
                    {
                        ps.sLink = new Uri(m.Groups[1].ToString().Replace("\\", ""));
                        ps.Error = null;
                        bp.Existance = true;
                    }
                    else
                    {
                        ps.Error = new Exception("Не найдена ссылка на пост.");
                        bp.Existance = false;
                    }
                }
            }
            catch (WebException we)
            {
                Log("MakePost WebError: " + we.Message);
                ps.Error = we;
            }
            //
            return ps;
        }

        /// <summary>
        /// Получение параметра разрешения по типу.
        /// </summary>
        /// <returns></returns>
        private static string GetAccessType(PostType pt)
        {
            switch (pt)
            {
                //'private', 'all_friends'
                case PostType.Private:
                    return "private";
                case PostType.FriendsOnly:
                    return "all_friends";
                default:
                //case PostType.Public:
                    return "public";
            }
        }

        /// <summary>
        /// Залогинивание, будь проклят этот яндекс
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public override bool LogInto(UserAccount user)
        {
            if (_isLoggedIn) return _isLoggedIn;
            //выделим логин 

            HttpWebRequest myHttpWebRequest = MakeRequest("http://mail.yandex.ru");
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

            //получаем ответ
            string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding).ReadToEnd();
            myHttpWebResponse.Close();
            //надо поймать гребанное место с JS аутентификацией.
            Regex getjs = new Regex("mode.{1}testloginjs.{5}id([0-9]+)[^0-9]+", RegexOptions.IgnoreCase);
            Match mc = getjs.Match(result);
            if (!mc.Success)
            {
                throw (new Exception("Не найден параметр GetJS для залогинивания в Yandex - " + user.username));
            }
            string magicJS = mc.Groups[1].ToString();
            myHttpWebRequest = MakeRequest("http://passport.yandex.ru/passport?mode=testloginjs&id" + magicJS);
            myHttpWebRequest.Accept = "*/*";
            // запрос на http://mail.yandex.ru
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            myHttpWebResponse.Close();
            // получаем куки, которые возвратил Yandex
            if (!String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"]))
            {
                magicJS = CookieParse(myHttpWebResponse.Headers["Set-Cookie"]);
                //урежем лишнее
            }
            // авторизация на yandex.ru
            myHttpWebRequest = MakeRequest("http://passport.yandex.ru/passport?mode=auth");
            myHttpWebRequest.Method = "POST"; // метод POST
            myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";

            // ставим False, чтобы при получении кода 302 не делать автоматический редирект
            myHttpWebRequest.AllowAutoRedirect = false;

            // передаем параметры
            TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1);
            string sQueryString = "retpath=http%3A%2F%2Fmail.yandex.ru%2F&timestamp=" +
                                  Math.Floor(ts.TotalSeconds).ToString() +
                                  "&login=" + user.username + "&passwd=" + user.password;
            byte[] byteArr = Encoding.GetEncoding(1251).GetBytes(sQueryString);
            myHttpWebRequest.ContentLength = byteArr.Length;
            myHttpWebRequest.GetRequestStream().Write(byteArr, 0, byteArr.Length);

            // выполняем запрос
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

            // получам куки
            if (!String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"]))
            {
                sCookie = CookieParse(myHttpWebResponse.Headers["Set-Cookie"]);
            }

            // найден новый url
            string sLocation = myHttpWebResponse.Headers["Location"];
            if (String.IsNullOrEmpty(sLocation))
            {
                //
                //Пока мы видим, что тут выводится табличка с предупреждением о смене компа и блаблабла =(
                //нужно извлечь IDKEY и опять послать запрос
                result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd();
                myHttpWebResponse.Close();
                Regex reg = new Regex("name.{2}idkey[^a-z]+value.{2}([a-z0-9]+)[^a-z0-9]+", RegexOptions.IgnoreCase);
                mc = reg.Match(result);
                if (!mc.Success)//не удалось найти ключ, пишем ошибку!
                {
                    throw (new Exception("Не найден параметр idkey для залогинивания в Yandex"));
                }
                string idkey = mc.Groups[1].ToString(); // =)
                myHttpWebRequest = MakeRequest("http://passport.yandex.ru/passport?mode=auth");
                myHttpWebRequest.Method = "POST"; // метод POST
                myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
                // ставим False, чтобы при получении кода 302 не делать автоматический редирект
                myHttpWebRequest.AllowAutoRedirect = false;

                // передаем параметры
                ts = DateTime.Now - new DateTime(1970, 1, 1);
                sQueryString = "filled=yes&yes=1&timestamp=" + Math.Floor(ts.TotalSeconds).ToString() +
                                      "&idkey=" + idkey;
                byteArr = Encoding.GetEncoding(1251).GetBytes(sQueryString);
                myHttpWebRequest.ContentLength = byteArr.Length;
                myHttpWebRequest.GetRequestStream().Write(byteArr, 0, byteArr.Length);
                if (!String.IsNullOrEmpty(magicJS))
                {
                    myHttpWebRequest.Headers.Add(HttpRequestHeader.Cookie, magicJS);
                }

                // выполняем запрос
                myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                //new 
                //result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd();
                //
                myHttpWebResponse.Close();
                // получаем ссылку
                sLocation = myHttpWebResponse.Headers["Location"];
                if (String.IsNullOrEmpty(sLocation))
                {
                    throw (new Exception("Не удалось залогинится в Яндекс - " + user.username));
                }
                //обновляем куки
                if (!String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"]))
                {
                    sCookie = CookieParse(myHttpWebResponse.Headers["Set-Cookie"]);
                }
            }
            sCookie = magicJS +"; " + sCookie;
            // формируем запрос
            myHttpWebRequest = MakeRequest(sLocation);
            myHttpWebRequest.Referer = "http://mail.yandex.ru";
            myHttpWebRequest.Method = "GET"; // метод 
            // ставим False, чтобы при получении кода 302 не делать автоматический редирект
            myHttpWebRequest.AllowAutoRedirect = false;

            // выполняем запрос
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            myHttpWebResponse.Close();
            ///Вот тут мы уже может сказать получилось или нет =)
            // найден новый url
            sLocation = myHttpWebResponse.Headers["Location"];
            if (String.IsNullOrEmpty(sLocation))
            {
                throw (new Exception("Не удалось залогинится в Яндекс - " + user.username));
            }
            //обновляем куки
            if (!String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"]))
            {
                sCookie = CookieParse(myHttpWebResponse.Headers["Set-Cookie"]);
            }
            myHttpWebRequest = MakeRequest(sLocation);
            myHttpWebRequest.Referer = "http://mail.yandex.ru";
            myHttpWebRequest.Method = "GET"; // метод POST
            // ставим False, чтобы при получении кода 302 не делать автоматический редирект
            myHttpWebRequest.AllowAutoRedirect = false;

            // выполняем запрос
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            myHttpWebResponse.Close();

            //sLocation = myHttpWebResponse.Headers["Location"];

            // получам куки
            if (!String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"]) && sCookie.ToLower().IndexOf("session_id=") != -1)
            {
//нужно просто убить старый session_id
                Regex sessremover = new Regex(@"\ssession_id\W\S+(\s|$)", RegexOptions.IgnoreCase);
                sCookie = sessremover.Replace(sCookie, " ");
                sCookie += "; " + CookieParse(myHttpWebResponse.Headers["Set-Cookie"]);
            }
            else
            {
                //throw (new Exception("Не удалось залогиниться в Яндекс - " + user.username));
            }
            // Закончили с базовой аутентификацией, теперь ярушечка =)))
            sCookie = "Cookie_check=1; webchat_server=01; autoarea=text; " + sCookie;
            //http://pass.yandex.ru/?retpath=http%3A%2F%2Fflashr.ya.ru%2Fajax%2Fpost_do_save.xml&ncrnd=9198
            myHttpWebRequest = MakeRequest(String.Format("http://pass.yandex.ru/?retpath=http://{0}.ya.ru/ajax/post_do_save.xml", user.username));
            myHttpWebRequest.Referer = String.Format("http://{0}.ya.ru/posts_add_text.xml", user.username);
            myHttpWebRequest.Method = "GET"; // метод POST
            // ставим False, чтобы при получении кода 302 не делать автоматический редирект
            myHttpWebRequest.AllowAutoRedirect = false;
            // выполняем запрос
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            myHttpWebResponse.Close();
            ///////////
            sCookie = CookieParse(myHttpWebResponse.Headers["Set-Cookie"]);
            //теперь делаем запрос к http://flashr.ya.ru/pass?retpath=
            myHttpWebRequest = MakeRequest(myHttpWebResponse.Headers["Location"]);
            myHttpWebRequest.Referer = String.Format("http://{0}.ya.ru/posts_add_text.xml", user.username);
            myHttpWebRequest.Method = "GET"; // метод POST
            // ставим False, чтобы при получении кода 302 не делать автоматический редирект
            myHttpWebRequest.AllowAutoRedirect = false;
            // выполняем запрос
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            myHttpWebResponse.Close();
            ////////////
            //Cookie_check=1;
            sCookie = "webchat_server=01; autoarea=text; " + CookieParse(myHttpWebResponse.Headers["Set-Cookie"]);
            _isLoggedIn = sCookie.ToLower().Contains(String.Format("yandex_login={0}",user.username));
            if (_isLoggedIn)
            {
                LoggedInAs = user;
            }
            return _isLoggedIn;
        }


        /// <summary>
        /// Выкладывание записи в блоге
        /// </summary>
        /// <param name="user">Аккаунт блогера</param>
        /// <param name="bp">коммент для блога</param>
        /// <returns></returns>
        public override PostResult MakeComment(UserAccount user, CommentPost bp)
        {
            PostResult ps = new PostResult {Error = new NotImplementedException()};
            try
            {
                //определяем, что за пользователь, которому оставляем комментарий
                BlogType bt;
                String blogname;
                if (!ValidateLink(bp.Link.OriginalString, out blogname, out bt))
                {
                    throw new Exception("Cant comment on " + bp.Link.OriginalString);
                }
                //logging
                if (!LogInto(user))
                {
                    throw new Exception("YaRu: не удалось залогинится");
                }

                string bloglink = bp.Link.OriginalString.Contains("for_reply=text")
                                      ? bp.Link.OriginalString
                                      : bp.Link.OriginalString + "&for_reply=text";
                //getting post-page...
                HttpWebRequest myHttpWebRequest = MakeRequest(bloglink);
                //HttpWebRequest myHttpWebRequest = MakeRequest(this.GetBlogLink(user.username));
                myHttpWebRequest.AllowAutoRedirect = false;
                myHttpWebRequest.Referer = GetBlogLink(user.username);
                myHttpWebRequest.Method = "GET"; // метод GET
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                if (!String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.Location]))//это если мы комментим не сами себя
                {
                    bool successed = false;
                    //string oldcookie = sCookie;
                    myHttpWebRequest = MakeRequest(myHttpWebResponse.Headers[HttpResponseHeader.Location]);
                    myHttpWebRequest.AllowAutoRedirect = false;
                    myHttpWebRequest.Headers[HttpRequestHeader.Cookie] = "Cookie_check=1; ";
                    myHttpWebRequest.Referer = "http://" + bp.Link.Host + bp.Link.AbsolutePath;
                    myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    if (!String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.Location]))
                    {
                        myHttpWebRequest = MakeRequest(myHttpWebResponse.Headers[HttpResponseHeader.Location]);
                        myHttpWebRequest.AllowAutoRedirect = false;
                        myHttpWebRequest.Headers[HttpRequestHeader.Cookie] = sCookie;
                        myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                        if (!String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.Location]))
                        {
                            myHttpWebRequest = MakeRequest(myHttpWebResponse.Headers[HttpResponseHeader.Location]);
                            myHttpWebRequest.AllowAutoRedirect = false;
                            myHttpWebRequest.Headers[HttpRequestHeader.Cookie] = "Cookie_check=1; " + CookieParse(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]);
                            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                            if (!String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.Location])
                                && !String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]))
                            {
                                //нам нужно Cookie_check + L + Session_id + yandex_login+yandex_uid
                                sCookie = "webchat_server=01; autoarea=text; " + CookieParse(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]);
                                myHttpWebRequest = MakeRequest(myHttpWebResponse.Headers[HttpResponseHeader.Location]);
                                myHttpWebRequest.AllowAutoRedirect = false;
                                myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();//наконец-таки открыли страницу назначения...
                                successed = true;
                                //NOTE: still doesnt work =(
                                myHttpWebResponse.Close();
                            }
                        }
                    }

                    if(!successed)
                    {
                        throw new Exception("Не удалось пройти повторную авторизацию при переходе на страницу дневника.");
                    }
                }

                string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding).ReadToEnd();
                myHttpWebResponse.Close();//если дошли до сюда, то все ок.

                Regex parseVars = new Regex(@"<div\sclass\W+[^'""]+?opened\W[^>]*?id:\D+(\d+)\D[^>]*item_no:\D+(\d+)\D[^>]*parent_id:\D(\d*)\D",
                    RegexOptions.Compiled|RegexOptions.IgnoreCase|RegexOptions.Multiline);
                Match parsedVars = parseVars.Match(result);
                //из него надо извлечь hostid - он же id номер кластера
                //и userpic =( и itemid - 
                //POSTDATA =userpic=157487ab50c064c41b932a4ba5075305&=&=&=&type=text&item_no=6256&parent_id=0&host_id=28067447&host=28067447.id.&body=test
                //onclick="return { source: {id:'28067447', login:'Topbot', type:'blog'},
                //item_no: '6256',parent_id: '',author_id: '28067447',
                //author_login: 'Topbot',author_title: 'Topbot',author_qu: '11',access: 'public',
                //type: 'text',record_is_anonymous: false, body: '', transparent: false, is_reply: false,
                //post_id: '6256'}
                if (parsedVars.Success)
                {
                    //попробуем извлечь номер аватарки
                    Regex _rAva = new Regex(@"/avatars\.yandex\.net/get\-avatar/"+user.username+@"/(\d+)\D+",
                                            RegexOptions.Singleline | RegexOptions.Compiled);
                    Match mUserpic = _rAva.Match(result);
                    myHttpWebRequest = MakeRequest(String.Format("http://{0}.ya.ru/ajax/replies_do_add.xml", blogname));
                    myHttpWebRequest.AllowAutoRedirect = false;
                    //выставили куку
                    myHttpWebRequest.Referer = bloglink;
                    myHttpWebRequest.Method = "POST"; // метод POST
                    myHttpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
                    string sQueryString = String.Format("userpic={0}&wysiwyg_c=1&type=text&host_id={1}&host={1}.id.&item_no={2}&parent_id={3}&body=test&trackback=0",
                        mUserpic.Groups[1].Value, parsedVars.Groups[1].Value, parsedVars.Groups[2].Value, 
                        String.IsNullOrEmpty(parsedVars.Groups[3].Value) ? "0" : parsedVars.Groups[3].Value);
                    //***************//
                    byte[] byteArr = Encoding.GetBytes(sQueryString);
                    myHttpWebRequest.ContentLength = byteArr.Length;
                    myHttpWebRequest.Referer = bp.Link.OriginalString;
                    myHttpWebRequest.GetRequestStream().Write(byteArr, 0, byteArr.Length);
                    myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding).ReadToEnd();
                    myHttpWebResponse.Close();//если дошли до сюда, то все ок.

                    Regex rNum = new Regex(@"\D(\d+)\D", RegexOptions.Singleline | RegexOptions.Compiled);
                    Match isOK = rNum.Match(result);
                    if (result.Contains("Success") || isOK.Success)
                    {
                        ps.Error = null;
                        ps.sLink = new Uri(String.Format("http://{0}.ya.ru/replies.xml?parent_id={1}&item_no={2}&with_parent=1",
                            blogname, isOK.Groups[1].Value, parsedVars.Groups[2].Value));
                    }
                    else
                    {
                        ps.Error = new Exception("Комментирование сделано, но не найдена ссылка на комментарий. =(");
                    }
                }
                else
                {
                    throw new Exception("Нет возможности комментирования, возможно комментирование записи отключено. =(");
                }
            }
            catch (Exception we)
            {
                Log("MakeComment WebError: " + we.Message);
                ps.Error = we;
            }
            //
            return ps;
        }

        #endregion

        #region Функционал экспорта данных

        /// <summary>
        /// Получение ссылки на RSS блогера
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="btype"></param>
        public override String GetRssLink(string userName, BlogType btype)
        {
            return btype == BlogType.Community ? String.Format("http://clubs.ya.ru/{0}/rss/posts.xml", userName) : String.Format("http://{0}.ya.ru/rss/posts.xml", userName);
        }

        /// <summary>
        /// Получение ссылки на FOAF блогера
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="btype">Тип блога - сообщество или блог</param>
        /// <remarks>Неработает если имя пользователя русское, тогда нужен номер</remarks>
        public override String GetFoafLink(string userName, BlogType btype)
        {
            return GetBlogLink(userName, btype) + "/foaf.xml";
        }

        #endregion

        #region IQuote

        /// <summary>
        /// Получение ссылки для цитирования по посту
        /// </summary>
        /// <param name="bp">Заполненный объект с постом</param>
        /// <returns>ссылку на страницу цитирования, NULL если цитирование не возможно</returns>
        /// <remarks>http://wow.ya.ru/posts_add_link.xml?URL=http%3A//news.kremlin.ru/news/8739&title=%D0%A3%D0%BF%D1%80%D0%B0%D0%B7%D0%B4%D0%BD%D0%B5%D0%BD%D0%BE%20%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%B0%D0%B3%D0%B5%D0%BD%D1%82%D1%81%D1%82%D0%B2%D0%BE%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%BC%20%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F%D0%BC</remarks>
        public String GetQuoteLink(BlogPost bp)
        {
            if (String.IsNullOrEmpty(bp.Body)) return "";
            string text = bp.Body.Length > 300 ? bp.Body.Substring(0, 300) : bp.Body;
            return
                String.Format("http://wow.ya.ru/posts_add_link.xml?URL={0}&title={1}",
                HttpUtility.UrlEncode(bp.Link.OriginalString), HttpUtility.UrlEncode(text));
        }

        #endregion

        #region ILike

        /// <summary>
        /// if (window.Ya && window.Ya.Share ) { Ya.Share.showCounter(
        //    Traceback (most recent call last):
        //  File "/usr/lib/yandex/blogs/python-common/utils.py", line 502, in method
        //    ret = func(*args, **kw)
        //  File "/usr/lib/yandex/blogs/python-common/utils.py", line 292, in protected
        //    return func (*args, **kw)
        //  File "/usr/lib/yandex/blogs/aux/Profile.py", line 1085, in GetShareCount
        //    return '<count>%s</count>' % ShareButton.get(url)
        //  File "/usr/lib/yandex/blogs/python-common/ShareButton.py", line 41, in get
        //    documents = list(get_collection().find({'key': key}, read_preference=ReadPreference.SECONDARY))
        //  File "/usr/lib/python2.5/site-packages/pymongo/cursor.py", line 814, in next
        //    if len(self.__data) or self._refresh():
        //  File "/usr/lib/python2.5/site-packages/pymongo/cursor.py", line 763, in _refresh
        //    self.__uuid_subtype))
        //  File "/usr/lib/python2.5/site-packages/pymongo/cursor.py", line 700, in __send_message
        //    **kwargs)
        //  File "/usr/lib/python2.5/site-packages/pymongo/mongo_replica_set_client.py", line 1546, in _send_message_with_response
        //    raise AutoReconnect(msg, errors)
        //AutoReconnect: No replica set secondary available for query with ReadPreference SECONDARY
        //No replica set secondary available for query with ReadPreference SECONDARYGetShareCountAutoReconnect
        //) }
        /// </summary>
        /// <param name="Link"></param>
        /// <returns></returns>
        //Removed
        //public Dictionary<string, int> GetLikes(Uri Link)
        //{
        //    var oRet = new Dictionary<string, int>();
        //    try
        //    {
        //        HttpWebRequest myHttpWebRequest;
        //        HttpWebResponse myHttpWebResponse;
        //        string faceLink = String.Format(
        //                "http://wow.ya.ru/ajax/share-counter.xml?url={0}",
        //                HttpUtility.UrlEncode(Link.OriginalString));
        //        myHttpWebRequest = MakeRequest(faceLink);
        //        myHttpWebRequest.Method = "GET"; // метод GET
        //        myHttpWebRequest.Referer = "http://wow.ya.ru";
        //        //получаем ответ и его разбираем...
        //        myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
        //        string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd();
        //        myHttpWebResponse.Close();
        //        MatchCollection mc = Regex.Matches(result, @"\(\D*(\d+)\D*\)");
        //        if (mc.Count > 0)
        //        {
        //            oRet.Add("count", int.Parse(mc[0].Groups[1].Value));
        //        }
        //    }
        //    catch (Exception e1)
        //    {
        //        Debug.WriteLine(e1);
        //    }
        //    return oRet;
        //}

        #endregion
    }
}